package com.nuoniu.sibanyun.service.erp.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.nuoniu.sibanyun.common.exception.NuoNiuException;
import com.nuoniu.sibanyun.common.lang.DateUtils;
import com.nuoniu.sibanyun.entity.dto.ErpAccountModuleDto;
import com.nuoniu.sibanyun.entity.erp.ErpAccountModule;
import com.nuoniu.sibanyun.entity.vo.ErpAccountModuleVo;
import com.nuoniu.sibanyun.mapper.erp.ErpAccountModuleMapper;
import com.nuoniu.sibanyun.service.ISysModuleService;
import com.nuoniu.sibanyun.service.erp.IErpAccountModuleService;
import com.nuoniu.sibanyun.service.erp.IErpVoucherTypeService;
import com.nuoniu.sibanyun.userThread.UserInfo;
import com.nuoniu.sibanyun.userThread.UserThreadLocal;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 账套模块设置 服务实现类
 * </p>
 *
 * @author baiqiang
 * @since 2020-09-22
 */
@Service
public class ErpAccountModuleServiceImpl extends ServiceImpl<ErpAccountModuleMapper, ErpAccountModule> implements IErpAccountModuleService {


    @Autowired
    private IErpVoucherTypeService erpVoucherTypeService;


    @Autowired
    private ISysModuleService sysModuleService;


    @Override
    public List<ErpAccountModuleVo> listCurrentErpAccountModuleVo(Integer accountId) {
        UserInfo userInfo = UserThreadLocal.get();
        List<ErpAccountModuleVo> erpAccountModuleVos = baseMapper.listCurrentErpAccountModuleVo(userInfo.getCompanyId(),accountId);
        //todo 检查是否使用（或者 在操作 业务的时候 直接设置）
        return erpAccountModuleVos;
    }

    @Override
    public void updateAccountModule(List<ErpAccountModuleDto> erpAccountModuleDtos) {
        LocalDateTime now = LocalDateTime.now();
        String yearStr = DateUtils.getYear();
        Integer year = Integer.valueOf(yearStr);
        String monthStr = DateUtils.getMonth();
        Integer month = Integer.valueOf(monthStr);
        if(erpAccountModuleDtos.size() == 0) {
            throw new NuoNiuException("保存失败，请选择记录");
        }
        Integer accountId = erpAccountModuleDtos.get(0).getAccountId();
        if(null == accountId) {
            throw new NuoNiuException("保存失败，参数错误");
        }
        UserInfo userInfo = UserThreadLocal.get();
        List<ErpAccountModule> submitList = new ArrayList<>();
        List<ErpAccountModuleVo> erpAccountModuleVos = listCurrentErpAccountModuleVo(accountId);
        erpAccountModuleDtos.forEach(dto->{
            Long fId = dto.getId();
            ErpAccountModule erpAccountModule = new ErpAccountModule();
            BeanUtils.copyProperties(dto,erpAccountModule);
            erpAccountModule.setIsLocked(null);
            // 校验 更新的数据是否存在/是否 可以更改状态
            if(null != fId){
                Optional<ErpAccountModuleVo> first = erpAccountModuleVos.stream().filter(f -> f.getId().equals(fId)).findFirst();
                if(first.isPresent()){
                    ErpAccountModuleVo erpAccountModuleVo = first.get();
                    if(erpAccountModuleVo.getIsLocked() && !dto.getStatus()){
                        throw new NuoNiuException("保存失败,模块" + erpAccountModuleVo.getModuleName() + "已经锁定，无法禁用");
                    }
                }else{
                    throw new NuoNiuException("保存失败,数据错误");
                }
            }
            //开启 重新赋值
            if(null == fId ){
                erpAccountModule.setCompanyId(userInfo.getCompanyId());
                erpAccountModule.setModuleId(dto.getOrgModuleId());
                if(dto.getStatus()){
                    //新增 数据
                    erpAccountModule.setEnableDate(now);
                    erpAccountModule.setEnableUserId(userInfo.getUserId());
                    erpAccountModule.setEnableAccountYear(year);
                    erpAccountModule.setEnableAccountMonth(month);
                }
            }
            submitList.add(erpAccountModule);
        });
        if( submitList.size() > 0 ){
            saveOrUpdateBatch(submitList);
            //todo 初始化 单据编码规则 时机选择
//            erpVoucherTypeService.initDefData(userInfo.getCompanyId());
        }


    }
}
